// 1
function* foo() {
  for (let i = 0; i < 3; i++) {
    yield i;
  }
}
let f = foo();
// console.log(f.next());
// console.log(f.next());
// console.log(f.next());
// console.log(f.next());

// 2
function* gen(x) {
  console.log("x", x);
  let y = 2 * (yield x + 1);
  console.log("y", y);
  let z = yield y / 3;
  console.log("z", z);
  return x + y + z; // return === yield
}

/**
 * 初始化 x = 5
 * 执行第一个 next 相当于 (yield x + 1) = 5 + 1 = 6
 * 执行第二个 next 相当于 y = 2 * 12（因为传入的12，传入的参数代替之前的值） /  y/3 = 24/3 = 8
 * 执行第三个 next 相当于 z = 20（因为传入的20，传入的参数代替之前的值） x + y + z = 5 + 24 + 20 = 49
 */
let g = gen(5); // 初始化 x = 5
console.log(g.next()); // 第一个next()传参无效、启动生成器
console.log(g.next(30));
console.log(g.next(80));
